package threadShare;

import lombok.extern.slf4j.Slf4j;

/**
 * @author： pang-yun
 * @date： 2021-10-14 17:15
 * 功能目的 ：用于  给线程加锁   防止竟态条件的发生
 *
 * t1 拿到锁对象后 ， 执行  synchronized 内的 程序  未执行完毕  时间片到了  ， 未释放锁
 * 操作系统 将 时间片给  t2   但是此时 lock 被线程 t1 占有  只能被阻塞    此时又发生上下文切换   t1 开始运行   运行完毕 ，释放lock   并将阻塞状态的 t2
 * 唤醒  执行
 *
 * [main] INFO threadShare.SynchronizedTest - counter: 0
 */

@Slf4j
public class SynchronizedTest {
    static int counter = 0;
    static Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                for (int i = 0; i < 5000000; i++) {
                    synchronized (lock) {
                        counter++;
                    }
                }

            }
        };

        Thread t2 = new Thread("t2") {
            @Override
            public void run() {
                for (int i = 0; i < 5000000; i++) {
                    synchronized (lock) {
                        counter--;
                    }
                }
            }
        };

        t1.start();
        t2.start();
        t1.join();
        t2.join();

        log.info("counter: {}", counter);

    }
}
